package com.centling.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.springframework.stereotype.Component;

@Component
public class LogInterceptor implements InvocationHandler{

	private Object target;
	
	public void beforeMethod(Method m){
		System.out.println(m.getName()+"---before method");
	}
	
	public Object bind(Object obj){
		//obj,这里的obj可以想象成userDAOImpl1,即某个接口的实现
		this.target = obj;
		//对于某个接口，产生代理，这个代理实现了接口，在代理执行方法时，会转到指定的invocation handler
		Object objProxy = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
		return objProxy;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		beforeMethod(method);
		//因为在bind方法中，已经将userDAOImpl1指定给target，所以，此处仍然是执行的userDAOImpl1的方法。
		method.invoke(target, args);
		return null;
	}
}
